package com.yuwen;

import com.yuwen.yuwenRPC.config.RegistryConfig;
import com.yuwen.yuwenRPC.constant.RpcConstant;
import com.yuwen.yuwenRPC.registry.Registry;
import com.yuwen.yuwenRPC.registry.RegistryFactory;
import com.yuwen.yuwenRPC.utils.ConfigUtils;
import com.yuwen.yuwenRPC.config.RpcConfig;
import lombok.extern.slf4j.Slf4j;

/**
 * @ClassNameRpcApplication
 * @Description TODO
 * @Author钰玟
 * @Date2025/3/30 下午1:11
 * @Version 1.0
 **/
@Slf4j
public class RpcApplication {
    private  static volatile RpcConfig rpcConfig;

    /**
     * 初始化框架 传入自定义配置
     * @param newRpcConfig 自定义配置
     */
    public static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("RpcApplication start,RpcConfig: {}", rpcConfig);
        /**
         * 新增注册中心的初始化
         */
        //1.获取配置类中的注册中心类别
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        String registryType = registryConfig.getRegistryType();
//       2.通过工厂创建注册中心
        Registry registry = RegistryFactory.getRegistry(registryType);
        //3. 初始化注册中心
        registry.init(registryConfig);
        //4. 打印日志
        log.info("RpcApplication init,registryConfig: {}", registryConfig);

        /**
         * 创建并注册 shutdownHook JVM退出时的操作
         */
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run() {
                registry.destroy();
            }
        });
    }

    /**
     * 初始化
     */
    public static void init(){
        RpcConfig newRpcConfig;
        //从配置文件加载配置项
        try {
            newRpcConfig= ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            //配置加载失败 使用默认配置
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 双锁检查单例模式
     * @return
     */
    public static RpcConfig  getRpcConfig() {
        if(rpcConfig==null){
            synchronized (RpcApplication.class){
                if(rpcConfig==null){
                    init();
                }
            }
        }
        return rpcConfig;
    }

}
